﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Utils;
using MySql.Data.MySqlClient;

namespace Data
{
    public class Alumnos : Personas
    {
        private Planes _hnd_planes = new Planes();

        private Planes HndPlanes
        {
            get { return _hnd_planes; }
        }

        new private Entities.Alumno CreateInstance(DataRow row)
        {
            Entities.Persona instance = base.CreateInstance(row);
            return new Entities.Alumno(
                instance.Legajo,
                instance.Nombre,
                instance.Apellido,
                instance.Direccion,
                instance.Telefono,
                instance.Email,
                instance.FechaNacimiento,
                row["id_plan"].ToInt32()
            );
        }

        private Entities.Collections.AlumnosCollection CreateCollection(DataTable table)
        {
            Entities.Collections.AlumnosCollection c = new Entities.Collections.AlumnosCollection();
            foreach (DataRow r in table.Rows) c.Add(CreateInstance(r));

            return c;
        }

        public Entities.Alumno GetByLegajo(int legajo)
        {
            string s = "SELECT legajo, nombre, apellido, direccion, telefono, email, fecha_nacimiento, id_plan FROM personas WHERE legajo = @legajo";
            List<MySqlParameter> l = new List<MySqlParameter>();
            l.Add(new MySqlParameter("@legajo", legajo));
            Query q = new Query(s, l);
            DataTable t = q.Execute();

            if (t.Rows.Count > 0) return CreateInstance(t.Rows[0]);
            else return null;
        }

        public Entities.Collections.AlumnosCollection GetByPlan(Entities.Plan plan)
        {
            string s = "SELECT legajo, nombre, apellido, direccion, telefono, email, fecha_nacimiento, id_plan FROM personas WHERE id_plan = @id_plan ORDER BY apellido, nombre";
            List<MySqlParameter> l = new List<MySqlParameter>();
            l.Add(new MySqlParameter("@id_plan", plan.ID));

            return CreateCollection(new Query(s, l).Execute());
        }

        public Entities.Collections.AlumnosCollection GetCollection()
        {
            string s = "SELECT legajo, nombre, apellido, direccion, telefono, email, fecha_nacimiento, id_plan FROM personas WHERE perfil = 'ALUMNO' ORDER BY apellido, nombre";

            return CreateCollection(new Query(s, new List<MySqlParameter>()).Execute());
        }

        private void Insert(Entities.Alumno instance)
        {
            if (instance.State != Commons.EntityState.New) return;

            string s = "INSERT INTO personas ( nombre, apellido, direccion, telefono, email, fecha_nacimiento, id_plan, perfil ) VALUES ( @nombre, @apellido, @direccion, @telefono, @email, @fecha_nacimiento, @id_plan, 'ALUMNO' )";
            List<MySqlParameter> l = new List<MySqlParameter>();
            l.Add(new MySqlParameter("@nombre", instance.Nombre));
            l.Add(new MySqlParameter("@apellido", instance.Apellido));
            l.Add(new MySqlParameter("@direccion", instance.Direccion));
            l.Add(new MySqlParameter("@telefono", instance.Telefono));
            l.Add(new MySqlParameter("@email", instance.Email));
            l.Add(new MySqlParameter("@fecha_nacimiento", instance.FechaNacimiento));
            l.Add(new MySqlParameter("@id_plan", instance.IDPlan));
            new NonQuery(s, l).Execute();
        }

        private void Update(Entities.Alumno instance)
        {
            if (instance.State != Commons.EntityState.Modified) return;

            string s = "UPDATE personas SET nombre = @nombre, apellido = @apellido, direccion = @direccion, telefono = @telefono, email = @email, fecha_nacimiento = @fecha_nacimiento WHERE legajo = @legajo";
            List<MySqlParameter> l = new List<MySqlParameter>();
            l.Add(new MySqlParameter("@nombre", instance.Nombre));
            l.Add(new MySqlParameter("@apellido", instance.Apellido));
            l.Add(new MySqlParameter("@direccion", instance.Direccion));
            l.Add(new MySqlParameter("@telefono", instance.Telefono));
            l.Add(new MySqlParameter("@email", instance.Email));
            l.Add(new MySqlParameter("@fecha_nacimiento", instance.FechaNacimiento));
            l.Add(new MySqlParameter("@legajo", instance.Legajo));
            new NonQuery(s, l).Execute();
        }

        public void Save(Entities.Alumno instance)
        {
            if (instance.State == Commons.EntityState.New) Insert(instance);
            else Update(instance);
        }
    }
}
